package com.zjj.learn.designmodel.work.responsibilityChain;

public class ResponsibilityChainTest {

    public static void main(String[] args) {
        //1、声明一个报销申请
        ExpenseApply apply = new ExpenseApply("小美", 1000.00, "出差补助");
        //2、创建总经理
        GeneralManager generalManager = new GeneralManager();
        //3、声明财务，财务的下一步审核是总经理，所以需要将总经理作为 nextHandler 参数传递给财务
        FinancialAudit financialAudit = new FinancialAudit(generalManager);
        //4、声明部门领导，部门领导的下一步审核是财务
        GroupLeader leader = new GroupLeader(financialAudit);
        //5、从部门领导开始审核，就可以链式的全部传递下去了
        leader.handle(apply);
    }


    /**
     * 责任链模式
     *
     *     责任链模式是一行为型种设计模式，它通过将请求的发送者和接收者解耦，形成一个链式结构，并依次经过链中的每个节点来处理这个请求。
     *     当接收者不能处理该请求时，它会将请求传递给链中的下一个节点直到有一个节点能够处理该请求，或者某些情况直接打回重新从起点开始处理。
     *     这样就可以动态地建立一条请求处理的链，使得请求在不同的处理者之间进行转移，从而提高系统的灵活性和可扩展性。
     *
     *     责任链模式是一种行为型模式，它允许多个对象来共同处理一个请求，每一个对象就有将请求传递给下一个请求的next指针。
     *     一直下去依次执行，直到所有需要处理的对象全部处理完毕。
     *
     * 职责链模式主要包含以下角色:
     *
     *    抽象处理者（Handler）角色：定义一个处理请求的接口，包含抽象处理方法和一个后继连接。
     *    具体处理者（Concrete Handler）角色：实现抽象处理者的处理方法，判断能否处理本次请求，如果可以处理请求则处理，否则将该请求转给它的后继者。
     *    客户类（Client）角色：创建处理链，并向链头的具体处理者对象提交请求，它不关心处理细节和请求的传递过程。
     *
     * 例如：公司报销可能会有很多步流程【假设流程如下】。
     *
     *      1、员工提出申请
     *      2、直接部门领导审核
     *      3、财务审核
     *      4、总经理审核
     *      在执行过程中，只有当前步骤通过之后才会向下一步执行。
     *
     *  具体实现代码请见：
     *       {@link com.zjj.learn.designmodel.work.responsibilityChain.ExpenseProcessHandler}
     *              ExpenseProcessHandler 就是抽象处理类
     *       {@link com.zjj.learn.designmodel.work.responsibilityChain.GroupLeader}
     *       {@link com.zjj.learn.designmodel.work.responsibilityChain.FinancialAudit}
     *       {@link com.zjj.learn.designmodel.work.responsibilityChain.GeneralManager}
     *              GroupLeader、FinancialAudit 和 GeneralManager 表示三个具体处理类
     *       {@link com.zjj.learn.designmodel.work.responsibilityChain.ExpenseApply}
     *              ExpenseApply 属于客户类，将它指定给具体处理类的链头【链头：GroupLeader】
     *
     * 责任链模式的优缺点
     *
     *    优点：责任链模式的优点是可以动态地建立责任链，增加或删除处理者都很方便，同时也能避免请求发送者和接受者之间的紧耦合关系。
     *
     *    缺点：可能会造成请求在整个链上被处理多次或未被处理，因此需要根据场景进行合理的设计。
     **/
}
